BigQuery テーブルデータを Cloud Spanner にリバース ETL してみた。
こんにちは、みかみです。
先日、人生で初めて野生のハブに遭遇しました。
10mくらい先の道の真ん中にいたのを見ただけですが、遠目からでも認識できるハブ柄だったので、怖いので引き返しました。
やりたいこと
- BigQuery テーブルデータを直接 Cloud Spanner に取り込みたい
特に大規模なシステムにおいて、RDB に格納したトランザクションデータを DWH で集計して、その結果を RDB に戻して API などで参照するユースケースもあるのではないかと思います。
Google Cloud 環境であれば、Spanner データを参照する外部テーブルを作成しておけば、BigQuery から直接 Spanner データを参照できます。
また、SQL 1本で BigQuery データを直接 Spanner に連携できるようなので、試してみました。
前提
BigQuery や Spanner の API の有効化と操作に必要な権限は付与済みです。
また、文中、プロジェクトIDなど一部の文字は伏字に変更しています。
なお、本エントリで紹介している、EXPORT DATA
クエリを使用した BigQuery から Spanner へのデータエクスポートは、2024/10 現在、まだプレビューの機能です。
ご利用の際にはご留意ください。
準備
BigQuery の以下のテーブルデータ50件を、Spanner に連携します。
Spanner に test-mikami
という名前のインスタンスを建てて、work
データベースを作成しました。
work
データベースで BigQuery の連携元テーブルと同等の以下の DDL を実行して、mart_test
テーブルを作成しました。
CREATE TABLE mart_test (
created_at TIMESTAMP,
id INT64,
first_name STRING(1024),
last_name STRING(1024),
)
PRIMARY KEY(created_at);
BigQuery テーブルデータを Spanner にエクスポート
BigQuery で、以下の SQL を実行しました。
EXPORT DATA OPTIONS (
uri="https://spanner.googleapis.com/projects/[PROJECT_ID]/instances/test-mikami/databases/work",
format='CLOUD_SPANNER',
spanner_options="""{ "table": "mart_test" }"""
)
AS SELECT * FROM work.mart_test;
正常にエクスポートできたようなので、Spanner のテーブルデータを確認してみます。
EXPORT DATA
クエリ実行で、BigQuery テーブルデータが Spanner に連携できることが確認できました。
JSON 型データも連携できるか確認
ドキュメントによると、STRUCT
などの一部のデータ型は Spanner に同等のデータ型がないためサポートされていないそうです。
では、JSON 型カラムのデータは EXPORT DATA
で連携できるか確認してみます。
以下の DDL を実行して、Spanner に temp_json
テーブルを作成しました。
CREATE TABLE temp_json (
col_1 JSON,
col_2 JSON,
col_3 STRING(1024),
)
PRIMARY KEY(col_3);
連携元の BigQuery テーブルは以下です。
BigQuery で以下の SQL を実行しました。
EXPORT DATA OPTIONS (
uri="https://spanner.googleapis.com/projects/[PROJECT_ID]/instances/test-mikami/databases/work",
format='CLOUD_SPANNER',
spanner_options="""{ "table": "temp_json" }"""
)
AS SELECT * FROM dataset_1.temp_json;
JSON 型は Spanner でもサポートされているので、CAST などのデータ変換する必要はなく、そのままエクスポートできました。
BigQuery から Bigtable へのリバース ETL
EXPORT DATA
を使って、同様に Bigtable にも BigQuery テーブルデータをエクスポートできるようです。
Spanner へのデータエクスポートは 2024/10 現在まだプレビューですが、Bigtable へのエクスポートは GA になりました。
ですが、こちらは BigQuery Enterprise または Enterprise Plus エディションでのみサポートされているとのことです。
オンデマンドで実行したところ、やはり以下のエラーが発生しました。
同じく Enterprise または Enterprise Plus エディションでのみサポートされている、Continuous queries(継続的クエリ)と合わせての利用が想定されているのかと思いました。
まとめ(所感)
SQL を1本実行するだけで、あっけないほど簡単に BigQuery から Spanner にデータ連携できることが確認できました。
一部、データ型やカラムデータサイズど制限事項があるとはいえ、主に BigQuery と Spanner の仕様差異に起因するものであり、EXPORT DATA
で指定する SELECT
文で変換すれば問題ないのではないかと思います。
BigQuery からデータをファイル出力してバッチ処理で Spanner に取り込んで...のような作り込みが必要なくなるのはとてもありがたいと思いました!